fprintf関数は、引数で指定した値を書式に従い編集(変換)してファイルに出力します。
#include <stdio.h>
int fprintf(FILE *stream, const char *format, …);
*streamはfopen関数で取得した、ファイルポインタを指定します。
*format(書式)は第3引数以降で指定する値の編集形式を指定します。
第3引数以降は可変引数で、任意の引数を指定できます。ただし、*formatにより、間接的に引数の型名と個数を指定することになります。
戻り値として、正常に出力できた場合は出力した文字数が、エラーの場合は負の値を返します。
*format(書式)は%(パーセント)記号で始まり、「フラグ」、「最小フィールド幅」、「精度指定子」、「長さ指定子」、「変換指定子」が続きます。%と変換指定子以外は省略可能です。また、これら以外の文字については、そのまま出力します。
フラグは下表の文字で指定します。
| フラグ | 意味 |
|---|---|
| + | 常に符号(+か-)を出力します。(デフォルトでは負の場合のみ出力します。) |
| – | 左詰めで出力します。 |
| 0 | 0埋めで出力します。 |
| 1個の半角スペース | 正の数字の前に空白を出力します。 |
| # | 変換指定子により、異なります。
|
最小フィールド幅は十進整数値で指定し、最小限、何文字分のフィールド幅を確保するかを指定します。
精度指定子は「.数値」の形式で指定し、変換指定子により、次のような意味になります。
- dやi等の整数変換の場合は、最小桁数です。
- e、E、fの浮動小数点変換の場合は、小数点以下の桁数です。
- g、Gの浮動小数点変換の場合は、仮数の桁数です。
- sの文字列変換の場合は、文字列の長さの最大値です。
長さ指定子は数値を表す変換指定子に対して指定でき、次のような意味があります。
- hはshort型を表します。
- l(小文字のL)はlong int型かunsigned long int型を表します。
- Lはlong double型を表します。
変換指定子は変換の型を指定します。変換指定子には下表のようなものがあります。
| 変換指定子 | 意味 |
|---|---|
| c | 文字として出力します。出力するデータの型はint型又は、char型です。フラグ、精度指定子及び、長さ指定子は意味を持ちません。 |
| d、i | 符号つき十進整数として出力します。出力するデータの型はint型、short型、long型ですが、short型の場合は長さ指定子にhを、long型の場合はlを指定する必要があります。精度指定子を指定した場合は、指定した桁数は必ず出力されますが、変換後の値が指定された桁数に足りない場合は、左側が0で埋められます。デフォルトの精度は1です。なお、0を表示しようとした時に、明示的に精度として0が指定されていると、出力は空文字列となります。 |
| e、E | 符号つき十進浮動少数点数を指数形式で出力します。出力するデータの型はdouble型又は、long double型ですが、long double型の場合は長さ指定子にLを指定する必要があります。eとEの相違は、指数を表すEが英大文字か英小文字かだけです。 |
| f | 符号つき十進浮動少数点数を小数点を用いて出力します。出力するデータの型はfloat型、double型、long double型ですが、long double型の場合は長さ指定子にLを指定する必要があります。float型の場合はdouble型に変換されます。小数点の後の桁数は、精度で指定された値となりますが、精度として明示的に0が指定された場合は、小数点以下は表示されません。また、小数点を表示する際には、小数点の前に少なくとも一桁は数字が表示されます。精度が指定されていない場合には6として扱われます。 |
| g、G | 符号つき十進浮動少数点数を指数形式又は、小数点を用いて出力します。上記、e、E、fとの相違は変換する値の大きさにより、出力形式が変わることです。 |
| n | これまでに出力された文字数を、int型のポインタ引数が指す整数に保存します。 |
| o、u、x、X | unsigned int型の値を、符号なし八進数(o)、符号なし十進数(u)、符号なし十六進数(xとX)として出力します。xは英小文字で、Xは英大文字で出力します。また、精度指定があれば精度で指定した桁数は必ず出力され、変換後の値が指定された桁数に足りない場合は、左側が0で埋められます。 |
| s | char型の配列を文字列としてを出力します。配列中の文字は、終端のヌル文字(’\0’)の前まで出力されます。ただし、精度が指定されていると、指定された文字数だけ出力します。(ヌル文字は無くてもよい。) |
| p | void *型(void型のポインタ)を十六進数で出力します。 |
次の例題プログラムは身長と体重を入力して、肥満度(BMI)を算出し、固定長テキストレコード形式でファイルに出力します。ちなみに、番号は3文字の整数、身長と体重及び、肥満度は7文字の十進浮動少数点数(小数点以下2位まで出力)として出力しています。
プログラム 例
#include <stdio.h>
int main()
{
FILE *fp;
int number; /* 番号 */
double weight; /* 体重 */
double height; /* 身長 */
double bmi; /* 肥満度 */
int return_code = 0;
if ((fp = fopen('temp_2.txt', 'w')) != NULL) {
number = 0;
while(1) {
printf('%03d番目の入力\n', ++number);
printf('\t体重(Kg)を入力してください ==> ');
scanf('%lf', &weight);
if (weight == 0.0) {
break;
}
printf('\t身長(Cm)を入力してください ==> ');
scanf('%lf', &height);
/* 肥満度(BMI) = 体重(kg) / 身長(m) / 身長(m) */
bmi = weight / (height / 100.0) / (height / 100.0);
/* ファイルに出力 */
fprintf(fp, '%03d%07.2f%07.2f%07.2f\n',
number, weight, height, bmi);
}
fclose(fp);
}
else {
printf('ファイルのオープンに失敗しました\n');
return_code = 1;
}
return return_code;
}
例の実行結果
$ ./fprintf.exe
001番目の入力
体重(Kg)を入力してください ==> 67.5
身長(Cm)を入力してください ==> 175.5
002番目の入力
体重(Kg)を入力してください ==> 88
身長(Cm)を入力してください ==> 187.8
003番目の入力
体重(Kg)を入力してください ==> 54.3
身長(Cm)を入力してください ==> 164
004番目の入力
体重(Kg)を入力してください ==> 0
$
$ cat temp_2.txt
0010067.500175.500021.92
0020088.000187.800024.95
0030054.300164.000020.19
$